package Report;

import java.util.Vector;
import java.util.Date;

/**
 * Ein <code>ReportWriter</code>, der Reports mittels Plain Text formatiert. Das im
 * Zielformat vorliegende Ergebnis wird in der Variable <code>reportText</code>
 * abgelegt und kann nach Aufruf der entsprechenden Prozessierungsmethode mit
 * <code>getReportText()</code> ausgelesen werden.
 *
 * @author Thies (Quelle: BankProjekt 1.1)
 */

public class PlainTextReportWriter extends ReportWriter {

	/**
	 * Diese Variable wird mit dem Ergebnis einer Umwandlung (vgl.
	 * <code>process...</code>-Methoden) belegt. Format: Text
	 */
	private String reportText = "";

	/**
	 * Zurücksetzen der Variable <code>reportText</code>.
	 */
	public void resetReportText() {
		this.reportText = "";
	}

	/**
	 * Header-Text produzieren.
	 * @return Text
	 */
	public String getHeader() {
		// Wir benötigen für Demozwecke keinen Header.
		return "";
	}

	/**
	 * Trailer-Text produzieren.
	 * @return Text
	 */
	public String getTrailer() {
		// Wir verwenden eine einfache Trennlinie, um das Report-Ende zu markieren.
		return "___________________________________________";
	}

	/**
	 * Prozessieren des übergebenen Reports und Ablage im Zielformat. Ein Auslesen
	 * des Ergebnisses kann später mittels <code>getReportText()</code> erfolgen.
	 *
	 * @param r der zu prozessierende Report
	 */
	public void process(SeatallocationOfASpecificFlightRealizationReport r) {

		// Zunächst löschen wir das Ergebnis vorhergehender Prozessierungen.
		this.resetReportText();

		/*
		 * In diesen Buffer schreiben wir während der Prozessierung sukzessive unsere
		 * Ergebnisse.
		 */
		StringBuffer result = new StringBuffer();

                /**
                 * Erstellungsdatum zwischenspeichern
                 */
                Date d = r.getDateOfReport();

		/*
		 * Nun werden Schritt für Schritt die einzelnen Bestandteile des Reports
		 * ausgelesen und in Text-Form übersetzt.
		 */
                result.append("\n\n");
		result.append("*** " + r.getTitle() + " ***\n\n");
		result.append(r.getHeaderData() + "\n");
		result.append("Dieser Report wurde am " + r.convertDateToString(d) + " erstellt" + "\n\n");
		Vector<Row> rows = r.getRows();

		for ( Row row : rows ) {
			for ( int k = 0; k < row.getNumColumns(); k++ ) {
				result.append(row.getColumnAt(k)+ "\t ; \t");
			}

			result.append("\n");
		}

		result.append("\n");
		result.append(r.getImprint() + "\n");

		/*
		 * Zum Schluß wird unser Arbeits-Buffer in einen String umgewandelt und der
		 * reportText-Variable zugewiesen. Dadurch wird es möglich, anschließend
		 * das Ergebnis mittels getReportText() auszulesen.
		 */
		this.reportText = result.toString();

	}

	/**
	 * Prozessieren des übergebenen Reports und Ablage im Zielformat. Ein Auslesen
	 * des Ergebnisses kann später mittels <code>getReportText()</code> erfolgen.
	 *
	 * @param r der zu prozessierende Report
	 */
	public void process(FlightmovementsOfSpecificPassengerReport r) {

		// Zunächst löschen wir das Ergebnis vorhergehender Prozessierungen.
		this.resetReportText();

		/*
		 * In diesen Buffer schreiben wir während der Prozessierung sukzessive unsere
		 * Ergebnisse.
		 */
		StringBuffer result = new StringBuffer();

                /**
                 * Erstellungsdatum zwischenspeichern
                 */
                Date d = r.getDateOfReport();

		/*
		 * Nun werden Schritt für Schritt die einzelnen Bestandteile des Reports
		 * ausgelesen und in Text-Form übersetzt.
		 */
		result.append("*** " + r.getTitle() + " ***\n\n");
		result.append(r.getHeaderData() + "\n");
		result.append("Dieser Report wurde am " + r.convertDateToString(d) + " erstellt" + "\n\n");
		Vector<Row> rows = r.getRows();

		for ( Row row : rows ) {
			for ( int k = 0; k < row.getNumColumns(); k++ ) {
				result.append(row.getColumnAt(k)+ "\t ; \t");
			}

			result.append("\n");
		}

		result.append("\n");
		result.append(r.getImprint() + "\n");

		/*
		 * Zum Schluß wird unser Arbeits-Buffer in einen String umgewandelt und der
		 * reportText-Variable zugewiesen. Dadurch wird es möglich, anschließend
		 * das Ergebnis mittels getReportText() auszulesen.
		 */
		this.reportText = result.toString();
	}

	/**
	 * Auslesen des Ergebnisses der zuletzt aufgerufenen Prozessierungsmethode.
	 *
	 * @return ein String bestehend aus einfachem Text
	 */
	public String getReportText() {
		return this.getHeader() + this.reportText + this.getTrailer();
	}

        
}